class Maillon():
    def __init__(self, valeur, suivant):
        self.valeur = valeur
        self.suivant = suivant

class File():
    def __init__(self, tableau=None):
        self.tete = None
        self.queue = None
        if tableau is not None:
            for element in tableau:
                self.enfiler(element)
    
    def est_vide(self):
        return self.tete is None
    
    def enfiler(self, valeur):
        if self.queue is None:
            assert self.tete is None
            self.tete = self.queue = Maillon(valeur, None)
        else:
            self.queue.suivant = Maillon(valeur, None)
            self.queue = self.queue.suivant
    
    def defiler(self):
        if self.tete is None:
            raise Exception("Impossible de défiler une file vide")
        else:
            valeur = self.tete.valeur
            self.tete = self.tete.suivant
            if self.tete is None:
                self.queue = None
            return valeur
    
    def tableau(self):
        tab = []
        maillon = self.tete
        while maillon is not None:
            tab.append(maillon.valeur)
            maillon = maillon.suivant
        return tab
    
    def __repr__(self):
        return str(self.tableau())
    
    def __str__(self):
        chaine = "Tête : "
        m = self.tete
        while m is not None:
            chaine += str(m.valeur) + " <= "
            m = m.suivant
        chaine = chaine[:-3] + "(queue)"   # On enlève le dernier signe "<= "
        return chaine
    